#ifndef BORWEIN_H_
#define BORWEIN_H_

#include "general.h"

/* Estrutura para Borwein concorrente */
typedef struct
{
    int i;          /* Número de iterações */    
    mpf_t y[3];     /* Variáveis y e a de acordo com o pipeline */
    mpf_t a[2];     
    mpf_t pi[2];    /* Pi antigo e atual (para verificar convergência) */
    int stop;       /* B_TRUE se convergiu */
} bo_param;

/* Valores iniciais do método Borwein */
void bo_init_values(mpf_t y, mpf_t a);

/* Inicializa estrutura paralela */
void bo_init_param(bo_param *p);

/* Limpa estrutura paralela */
void bo_clear_param(bo_param *p);

/* Realiza o cálculo de y */
void bo_y_value(mpf_t y1, mpf_t y0);

/* Realiza o cálculo de a */
void bo_a_value(mpf_t a1, mpf_t a0, mpf_t y1, int k);

/* Realiza o cálculo de Pi */
void bo_pi_value(mpf_t pi, mpf_t a);

/* Método sequêncial de Borwein */
void borwein(mpf_t pi, long *it);

/* Método concorrente de Borwein */
void borwein_conc(mpf_t pi, long *it);

/* Borwein Thread para cálculo de y */
void *bot_calculate_y(void *arg);

/* Borwein Thread para cálculo de a */
void *bot_calculate_a(void *arg);

/* Borwein Thread para cálculo de Pi */
void *bot_calculate_pi(void *arg);

#endif /* BORWEIN_H_ */
